#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define enemynum 5
#define high 20
#define width 50
//全局变量
int canvas[high][width]={0};//二维数组记录画面中对应的元素
                          //  0输出空格，1输出飞机,2输出子弹,3输出敌机
int position_x,position_y;//飞机位置
int enemy_x[enemynum],enemy_y[enemynum];
int score;
int bulletwidth;



void gotoxy(int x,int y)//光标移动到(x,y)位置
{
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}

void HideCursor()
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void startup()//数据初始化
{

    position_x=high/2;
    position_y=width/2;

    canvas[position_x][position_y]=1;
    int k;
    for(k=0;k<enemynum;k++)
    {
        canvas[enemy_x[k]][enemy_y[k]]=0;
        enemy_x[k]=rand()%3;
        enemy_y[k]=rand()%width;
        canvas[enemy_x[k]][enemy_y[k]]=3;
    }
    bulletwidth=3;

    score=0;
}

void show()  //显示画面
{
    gotoxy(0,0);//光标移动到原点位置，以下重画清屏
    int i,j;

    for(i=0;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if(canvas[i][j]==1)
                printf("*");//输出飞机*
            else if(canvas[i][j]==2)
                printf("|");//输出子弹|
            else if(canvas[i][j]==3)
                printf("@");//输出敌机@
            else
                printf(" ");

        }
        printf("\n");
    }
    printf("得分：%d\n",score);
    HideCursor();
}
void updateWithoutInput()//与输入无关的更新
{
    int i,j,k;
    for(i=0;i<high;i++)
        for(j=0;j<width;j++)
    {
        if(canvas[i][j]==2)
        {
            for(k=0;k<enemynum;k++)
            {
                if(i==enemy_x[k]&&j==enemy_y[k])//击中敌机
            {
                canvas[enemy_x[k]][enemy_y[k]]=0;
                enemy_x[k]=0;
                enemy_y[k]=rand()%width;
                canvas[enemy_x[k]][enemy_y[k]]=3;

                score++;
                if(score%8==0)
                    bulletwidth++;
            }
            }


            //让子弹飞
            canvas[i][j]=0;
            if(i>0)
                canvas[i-1][j]=2;
        }
    }
    for(k=0;k<enemynum;k++)
    {
              if(enemy_x[k]>high)//敌机跑出下边界
    {
      canvas[enemy_x[k]][enemy_y[k]]=0;
      enemy_x[k]=0;
      enemy_y[k]=rand()%width;
      canvas[enemy_x[k]][enemy_y[k]]=3;
      score--;
    }
    }

    static int speed =10;
    if(speed<10)
        speed++;
    if(speed==10)
    {
        //自动下落的敌机
      for(k=0;k<enemynum;k++)
    {

      canvas[enemy_x[k]][enemy_y[k]]=0;
      enemy_x[k]++;
      canvas[enemy_x[k]][enemy_y[k]]=3;

    }
    speed=0;
    }



}
void updateWithInput()//与输入有关的更新
{
    char input;
    if(kbhit())
    {
        input=getch();
        if(input=='a')
        {
            canvas[position_x][position_y]=0;
            position_y--;
            canvas[position_x][position_y]=1;
        }
        if(input=='d')
        {
            canvas[position_x][position_y]=0;
            position_y++;
            canvas[position_x][position_y]=1;
        }
        if(input=='w')
        {
            canvas[position_x][position_y]=0;
            position_x--;
            canvas[position_x][position_y]=1;
        }
        if(input=='s')
        {
            canvas[position_x][position_y]=0;
            position_x++;
            canvas[position_x][position_y]=1;
        }
        if(input==' ')
        {
            int left,right;
            left=position_y-bulletwidth;
            if(left<0)
                left=0;
            right=position_y+bulletwidth;
            if(right>width-1)
                right=width-1;

            int x;
            for(x=left;x<=right;x++)
            canvas[position_x-1][x]=2;
        }
    }
}


int main()
{
    startup();//数据初始化
    while(1) //游戏循环执行
    {
        show();  //显示画面
        updateWithoutInput();//与输入无关
        updateWithInput();//与输入有关
    }


    return 0;
}

